#include "msg.h"
#include "task_msg.h"

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"


#include "boot.h"
#include "bsp_uart.h"
#include "tools.h"
#include "protocol.h"

/**************************************
	主要固件升级和解密的协议部分
**************************************/


MSG_T msg;

static portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
static uint8_t msgStat=0;  
static uint16_t msgIndex=0,checkOR=0;


/************************************************
函数名称 ： msgParse
功    能 ： 字节中断方式消息解析，消息帧解析
参    数 ： 无
返 回 值 ： 返回1：解析成功   0:解析失败
作    者 ： FlySnail
*************************************************/
uint8_t msgParse(uint8_t data,MSG_T *msg)
{
	uint8_t rq=0;
	switch(++msgStat)
	{
			case MSG_HEAD:
			{
					if(data==PROTOCOL_HEAD)
					{
							msg->head = data;
							msgIndex = 0;
							msg->len =0;
					}
					else    msgStat = MSG_IDEL;
					break;
			}
			case MSG_LEN:
			{
				 checkOR = 0;
				 if((data & 0x80)!=0 && msg->len==0){
				 		msg->len = (data & 0x7f)*128;
				 		msgStat = MSG_HEAD;
				 }else{
				 		msg->len = msg->len+data;
				 }
				 break;
			}
			case MSG_TYPE:     
			{
					msg->type = data;
					checkOR = checkOR ^ data;
					msgIndex++;
					if(msg->len==1)   // 没有消息内容
					{
							msgStat = MSG_PAYLOAD;
					}
					break;
			}
			case MSG_PAYLOAD:
			{
					msg->buff[msgIndex-1] = data;
					checkOR = checkOR ^ data;
					msgIndex++;
					if(msg->len==msgIndex)      msgStat = MSG_PAYLOAD;
					else            					  msgStat = MSG_TYPE;
					break;
			}
			case MSG_CK:
			{
					if(checkOR == data)
					{
						msg->ORck = data;
						rq = 1; // 校验成功
					}
					else {
						rq = 0;  // 校验失败
					}
					msgStat = MSG_IDEL;
					break;
			}
			default:
			{
					msgStat = MSG_IDEL;
					break;
			}
	}
	return rq;
}



